//
//  WBStatusListViewModel.swift
//  记忆微博
//
//  Created by phoenix on 2017/5/13.
//  Copyright © 2017年 phoenix. All rights reserved.
//

import Foundation

/// 微博数据列表视图模型
/*
 父类的选择
 
 - 如果类需要使用 ‘KVC’ 或 字典转模型框架设置对象值，类就需要继承自 NSObjcet
 - 如果累只是包装一些代码逻辑，可以不用任何父类，可以更加轻量级
 - 如果用 OC 写，一律都继承自 NSObject
 
 使命： 负责微博的数据处理
 1. 字典转模型
 2. 下拉/上拉刷新数据处理
 */

/// 上拉刷新最大尝试次数
fileprivate let maxPullupTryTimes = 3

class WBStatusListViewModel {
    
    /// 微博模型数组懒加载
    lazy var statusList = [WBStatus]()
    
    /// 上拉刷新错误次数
    fileprivate var pullupErrorTimes = 0
    
    /// 加载微博列表
    ///
    /// - pullup: 是否是上拉刷新
    /// - Parameter comletion: 完成回调[网络请求是否成功, 是否刷新表格]
    func loadStatus(pullup: Bool = false, comletion: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool) -> ()) {
        
        // 判断事都是上拉刷新，同时检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            
            comletion(true, false)
            
            return
        }
        
        // since_id 取出数组中第一条微博的 id
        let since_id = pullup ? 0 : (statusList.first?.id ?? 0)
        
        // 上拉刷新，取出数组的最后一条微博 id
        let max_id = !pullup ? 0 : (statusList.last?.id ?? 0)
        WBNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSucces) in
            
            // 1. 字典转模型
            // 将返回的json [[String: Any]] 每次将数组中的一个元素 [String: Any] 符合 [WBStatus] 的提取出来
            guard let array = NSArray.yy_modelArray(with: WBStatus.self, json: list ?? []) as? [WBStatus] else{
                
                comletion(isSucces, false)
                return
            }
            
            print("刷新到\(array.count)")
            
            // 2. 拼接数据
            // 将上述提取的每个 [WBStatus] 里面的元素全部放一个数组
            if pullup {
                // 上拉刷新结束后，将数组拼接在末尾
                self.statusList += array
            } else {
                // 下拉刷新，应该讲结果数组拼接在数组前面
                self.statusList = array + self.statusList                
            }
            
            // 3. 判断上拉刷新的数据量
            if pullup && array.count == 0 {
                
                self.pullupErrorTimes += 1
                comletion(isSucces, false)
            } else {
                // 3. 完成回调
                comletion(isSucces, true)
            }
            
        }
    }
    
}
